package volatileStudy;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 多个线程模拟原子性问题
 */
public class AtomicTest {
    public static void main(String[] args) {
        AtomicData atomicData = new AtomicData();
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                for (int j = 0; j < 100; j++) {
                    atomicData.numPlusPlus();
                    //解决volatile无法解决原子性问题，通过原子类解决
                    atomicData.addAtomic();
                }
            },String.valueOf(i)).start();
        }
        //主线程和gc线程
        while(Thread.activeCount() > 2){
            Thread.yield();
        }
        System.out.println("volatile修饰的普通变量的最终结果是:" + atomicData.num);
        System.out.println("解决volatile修饰的普通变量无法解决原子性问题的变量的最终结果:" + atomicData.atomicNum);
    }
}

/**
 * 原子类资源类
 */
class AtomicData{
    volatile int num;

    /**
     * 存在原子性问题
     */
    public void numPlusPlus(){
         num ++;
    }

    public AtomicInteger atomicNum = new AtomicInteger(num);
    public int addAtomic(){
        return atomicNum.getAndIncrement();
    }
}
